智慧停车之 IOT选型-电信物联网

    科技2022-07-16  115

    人员招聘都花了快一个月时间,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");     } }

     

    Processed: 0.009, SQL: 8