人员招聘都花了快一个月时间,UI,后台相对容易,2年的前端开发工资16K都招了大半个月,实在心累。不过还好,一个月的前期准备工作包括团队的组建总算完成。
上午陈工找到我,说不用电信iot平台了,我心里一麻,一周的学习和调试工作白做了。来公司前,iot平台用电信的,这个以前他们硬件这边就选好了,已经在测试了。问陈工,何为?答之:以后涉及到不同的通讯商每个都要做一套,有些地方通讯可能要用移动的,那得又做一套兼容移动的,所以选择平台兼容性强的,用阿里云的物联网平台。既然已经选择了用阿里云物联网平台,这个我也就不多说,阿里云的产品都是非常强大的,我也一直在用。这一周的时间我将电信的物联网平台也稍微玩了下,感觉也挺不错的,将调试过程也做个简单记录下。
1.注册个账号,可以在微信公众号搜索"天翼物联产业联盟",关注后申请注册,大概一天左右就能收到邮件,邮件里面有中国电信物联网开放平台(对接测试)开户密码通知,测试平台地址,开发者门户地址,测试平台应用对接地址(企业应用接入地址),测试平台设备对接地址(终端设备接入地址)这些内容,还算很全的。
2.按照文档地址找到下载专区将java sdk demo下载下来,快速看了下,每个API都有一个main方法,直接运行就可以看到效果很方便。
3.java环境准备工作。服务器上安装jdk,tomcat,nginx,配置证书等。
4.在电信物联网平台上注册应用。登录测试平台,注册一个应用,一定要选择"基础API包","公用事业(NB-Iot)API包"。
5.上传证书。登录开发者平台,选择对接信息,点击应用列表,上传 https的证书,格式为 PEM。
6.上传 profile 文件。可以通过在线编辑生成,登录开发者平台->Profile开发->Profile导入: 选择《 中国电信物联网开放平台profile样例》中一个zip文件例子,(WaterMeter_Huawei_NBIoTDevice.zip)。
7.插件编写及上传。导入《中国电信物联网开放平台设备编解码插件源码及样例》中的源码,打包jar,注意看源码中的com.thrid.party.codec.demo这几个文件,这是数据上传下载的核心所在。登录开发者平台->插件管理->编解码插件管理,上传插件,直接用例程就好,调试通过了后面再根据业务修改。
8.设备管理。设备模板,名称与选择的 profile 文件一致 如你选择的WaterMeter_Huawei_NBIoTDevice.zip,解压它,打开profile文件夹,打开里面的json文件,找到"serviceId": "WaterMeterBasic",服务名及id都填WaterMeterBasic。服务模板,内容和属性与profile文件 一致,命令先定义一个"SET_DEVICE_LEVEL"(随便选的一个下发命令,以后自己改),事件选择"deviceDataChanged"(数据上传需要)。
9.使用中国电信物联网开放平台北向API调试工具-_GUI_APPDemo-master。注册设备,两个下拉框,分别选择NB-IOT,Device Manager,Register,Direct Device,修改设备,Modify Device Info,设备上线,《平台接入流程描述》有指导手册,在SSCOM中通过一系列AT指令操作,检查激活状态Query Device Status,输入device id ,点击按钮"check status",返回"evice Status:ONLINE"表设成功。
10.数据上报。在平台订阅服务,可以使用 API调试工具-_GUI_APPDemo,两个下拉框,分别选择NB-IOT Subscribe Manager Notify Type选择 "deviceDataChanged" callback URL 填回调的htts地址,设备上报数据的前八位是AA720000,其它随意,形式类似AA720000AAAAAAAAAAAAAAAAAAAAAAAAAA。
11.命令下发。在平台订阅服务,可以使用 API调试工具-_GUI_APPDemo,Notify Type选择 "commandRsp" callback URL填回调的htts地址,下发命令的json格式类似:{"expireTime":"0","callbackUrl":"https://回调地址","deviceId":"111-111-11-11","command":{"method":"SET_DEVICE_LEVEL","paras":{"value":"自定义"},"serviceId":"服务ID"}}。
整个走下来,一脸懵逼,感觉忒复杂,既然平台里面里面API调式工具没有问题,我这边通过java尝试了下发消息和收消息,一切都还正常。
订阅平台业务数据例子:
@Service("subscribeBusinessService") public class SubscribeBusinessService { private static final Log log = LogFactory.getLog(SubscribeBusinessService.class); @PostConstruct public void recvMsg(){ try{ HttpsUtil httpsUtil = new HttpsUtil(); httpsUtil.initSSLConfigForTwoWay(); String accessToken = login(httpsUtil); String appId = Constant.APPID; String urlSubscribeServiceNotification = Constant.SUBSCRIBE_SERVICE_NOTIFYCATION; MapnotifyTypeAndcallbackurlMap = new HashMap<>(); notifyTypeAndcallbackurlMap.put("deviceAdded",Constant.DEVICE_ADDED_CALLBACK_URL);//添加新设备,订阅后推送注册设备通知 notifyTypeAndcallbackurlMap.put("deviceInfoChanged",Constant.DEVICE_INFO_CHANGED_CALLBACK_URL);//设备信息变化,订阅后推送设备信息变化通知 notifyTypeAndcallbackurlMap.put("deviceDataChanged",Constant.DEVICE_DATA_CHANGED_CALLBACK_URL);//设备数据变化,订阅后推送设备数据变化通知 notifyTypeAndcallbackurlMap.put("deviceDatasChanged",Constant.DEVICE_DATAS_CHANGED_CALLBACK_URL);//设备数据批量变化,订阅后推送批量设备数据变化通知 notifyTypeAndcallbackurlMap.put("deviceDeleted",Constant.DEVICE_DELETED_CALLBACK_URL);//删除设备,订阅后推送删除设备通知 notifyTypeAndcallbackurlMap.put("serviceInfoChanged",Constant.SERVICE_INFO_CHANGED_CALLBACK_URL);//服务信息变化,订阅后推送设备服务信息变化通知 notifyTypeAndcallbackurlMap.put("ruleEvent",Constant.RULE_EVENT_CALLBACK_URL);//规则事件,订阅后推送规则事件通知 Iterator<Map.Entry> entryIterator = notifyTypeAndcallbackurlMap.entrySet().iterator(); while(entryIterator.hasNext()){ Map.Entryentry = entryIterator.next(); String notifyType = entry.getKey(); String callbackurl = entry.getValue(); MapparamSubscribe = new HashMap<>(); paramSubscribe.put("notifyType", notifyType); paramSubscribe.put("callbackUrl", callbackurl); paramSubscribe.put("appId", appId); String jsonRequest = JsonUtil.jsonObj2Sting(paramSubscribe); Mapheader = new HashMap<>(); header.put(Constant.HEADER_APP_KEY, appId); header.put(Constant.HEADER_APP_AUTH, "Bearer" + " " + accessToken); HttpResponse httpResponse = httpsUtil.doPostJson(urlSubscribeServiceNotification, header, jsonRequest); String bodySubscribe = httpsUtil.getHttpResponseBody(httpResponse); System.out.println("SubscribeServiceNotification: " + notifyType + ", response content:"); System.out.println(httpResponse.getStatusLine()); System.out.println(bodySubscribe); System.out.println(); } }catch(Exception ex){ ex.printStackTrace(); } } @SuppressWarnings("unchecked") public static String login(HttpsUtil httpsUtil) throws Exception { String appId = Constant.APPID; String secret = Constant.SECRET; String urlLogin = Constant.APP_AUTH; MapparamLogin = new HashMap<>(); paramLogin.put("appId", appId); paramLogin.put("secret", secret); StreamClosedHttpResponse responseLogin = httpsUtil.doPostFormUrlEncodedGetStatusLine(urlLogin, paramLogin); System.out.println("app auth success,return accessToken:"); System.out.println(responseLogin.getStatusLine()); System.out.println(responseLogin.getContent()); System.out.println(); log.info("app auth success,return accessToken:"); log.info(responseLogin.getStatusLine()); log.info(responseLogin.getContent()); Mapdata = new HashMap<>(); data = JsonUtil.jsonString2SimpleObj(responseLogin.getContent(), data.getClass()); return data.get("accessToken"); } }