智慧停车(三) IOT选型-电信物联网

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u012898231/article/details/96149166

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

 

展开阅读全文

没有更多推荐了,返回首页