中移M5311-NBIOT-低功耗OPENCPU开发-MQTT

中移M5311-NBIOT-低功耗OPENCPU开发-MQTT

M5311 全部技术资料文档和SIM卡封装库 链接:https://pan.baidu.com/s/1VHIwO4L85O6BtLLxbIoPRQ 提取码:7wxh 

1.使用的模块M5311和开发板

2.测试环境搭建 

1.安装GNU Tools ARM Embedded

链接:https://pan.baidu.com/s/1KtBCoAraLGcQD3K5keVFww  提取码:kzxy 

下载下来之后解压,进入 GNU Tools ARM Embedded\GNU Tools ARM Embedded\4.9 2015q3\bin 文件夹

需要把bin路径加入环境变量

2.编译包

链接:https://pan.baidu.com/s/1_P_63FRWqI844MBFiYHbJQ 提取码:murc 
把包下载下来之后使用VSCode打开目录

然后执行下面这条命令进行编译

编译完成后烧录包在M5311-OpenCPU_v4.0.0_release\firmware\LV 下面

.\build.bat LV

3.烧录

链接:https://pan.baidu.com/s/1GaH02xHhjJcg0o-8eOYSlw 提取码:1uka 
下载烧录工具

选择COM口,点击OPEN,打开LV目录下的cfg文件,自动加载烧录配置信息

之后点击start,然后让板子重启或者开机(按住PWRKEY或者RESET按键)

3.程序

m5311_opencpu.c

/*
   M5311_opencpu.c
   created by xgl,2018/4/2
*/

#include "m5311_opencpu.h"


extern unsigned int OC_DEBUG_CHANNEL;
TaskHandle_t xHandle;
/*
  综合测试函数  
*/
void test_all_in_one()
{
	int i;
	unsigned char temp;
	unsigned  char iccid[40]={0};
	
	int iccid_len;
	unsigned char *p = 0;
	int rssi,rxlevel;
	unsigned char temp1,temp2;
    unsigned char spi_rx_buf[2]= {0};
    unsigned char spi_tx_buf[2]= {0};
	unsigned char base_version[30] = {0};
    hal_spi_master_config_t l_config;	
	hal_spi_master_send_and_receive_config_t spi_send_and_receive_config;
	custom_uart_init();
	opencpu_get_base_version(base_version);
	opencpu_printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
	opencpu_printf("OpenCpu Code Vserion 1.2 \n");	
	opencpu_printf(opencpu_fota_version_cb());
	opencpu_printf("\nBASE_VERSION:%s\n",base_version);
	opencpu_printf("update status:%d\n",update_status);



	if(opencpu_is_boot_from_sleep()==1){
		opencpu_printf("BOOT CAUSE:WAKE FROM SLEEP\n");
	}else{
		opencpu_printf("BOOT CAUSE:POWER_ON OR RESET\n");
	}



	opencpu_printf("M5311 opencpu ready!!\n");
	opencpu_printf("waiting for network...\n");



    opencpu_lock_light_sleep();			// 关闭PSSM




	//阻塞方式获取ICCID,必须要有SIM卡才能读到
	test_get_iccid();
	//获取网络注册状态,并阻塞等待网络注册成功
	opencpu_printf("network registering...\n");
	while(opencpu_cgact()!=1){
		vTaskDelay(1);
	}
	opencpu_printf("network register success\n");
	opencpu_printf("network ready!!\n");	

	uart_cmd = 0;

	mqtt_test2();

	
	opencpu_printf("opencpu_unlock_light_sleep!!\n");
	ril_power_saving_mode_setting_req_t psm_req1;
	psm_req1.mode=1;  
	psm_req1.req_prdc_rau=NULL;
	psm_req1.req_gprs_rdy_tmr=NULL;
	psm_req1.req_prdc_tau="01000001";
	psm_req1.req_act_time="00000101";
	opencpu_set_psmparam(&psm_req1);


	ril_power_saving_mode_setting_rsp_t psm_rsp1;
	opencpu_get_psmparam(&psm_rsp1);
	opencpu_printf("PSM: %d,%s,%s,%s,%s \n",psm_rsp1.mode,psm_rsp1.req_prdc_rau,
	   	    psm_rsp1.req_gprs_rdy_tmr,psm_rsp1.req_prdc_tau,psm_rsp1.req_act_time);

	opencpu_unlock_light_sleep();		// 打开PSM
	opencpu_unlock_light_sleep();		// 打开PSM
	opencpu_unlock_light_sleep();		// 打开PSM

	vTaskDelete(xHandle);				// 关闭线程
	opencpu_printf("vTaskDelete over !!\n");
}

//opencpu主任务函数
void opencpu_task_main()
{
  test_all_in_one();
}


/*
 新建opencpu任务,这个函数用户不可更改
*/
void test_opencpu_start()
{
	 xTaskCreate(opencpu_task_main,"opencpu",1024,NULL,TASK_PRIORITY_NORMAL,&xHandle);
}

opencpu_mqtt.c

#include "m5311_opencpu.h"

/***************************************
以下定义适用于onenet mqtt套件
CLIENTID:对应设备名称
USER:对应产品ID
PWD:用onenet官网的token.exe工具生成。
CMDREQUEST:

***************************************/
#define HOST "183.230.40.16"
#define PORT 8883
#define CLIENTID "test"
#define KEEPALIVE 120
#define USER "247845"
#define PWD "version=2018-10-31&res=products%2F247845%2Fdevices%2Ftest&et=1694376057&method=md5&sign=32%2B6jCEhKLdgXwdvpAQM8g%3D%3D"
#define CMDREQUEST "$sys/247845/test/cmd/request/"
#define CMDRESPON  "$sys/247845/test/cmd/response/"
uint8 onenetFlag = 0;




/*****************************************************
ack 回调函数,publish msg 收到ack后会触发该类型函数,用户自行编写;
传入:qos>0 时在opencpu_mqttpub 中传入该函数,不关心ack 可传入null
/*****************************************************/
void opencpu_recvpuback_cb()
{
	opencpu_printf("OC get ack\n");
	vTaskDelay(2000/portTICK_RATE_MS);
}
void opencpu_recvpuback_cb1()
{
	opencpu_printf("last publish success,off\n");
	vTaskDelay(1000/portTICK_RATE_MS);
	opencpu_mqttdisc();
}

/*****************************************************
接收到某主题的回调函数:接收到平台下对topic的推送消息是会触发该类型函数。
传入:在opencpu_mqttsub 订阅某topic时传入该类型函数。

/*****************************************************/
void opencpu_defaultpublish_cb(uint32_t dup, uint32_t qos, uint32_t retained, uint32_t msgid, char *topicname, uint32_t msglen, char *msg)
{

}

void opencpu_userpublish_cb(uint32_t dup, uint32_t qos, uint32_t retained, uint32_t msgid, char *topicname, uint32_t msglen, char *msg)
{

	opencpu_printf("+MYCB:%d,%d,%d,%d,%s,%d,%s\n",dup, qos, retained, msgid, topicname,msglen, msg);
	vTaskDelay(2000/portTICK_RATE_MS);
	//opencpu_mqttpub("temp1",1,0,0,0,"from_pub_usercb", NULL);
}

/*****************************
连接服务器成功的回调函数
*****************************/
void opencpu_open_cb(uint8_t result){
	if(result == 0 ){
		opencpu_printf("%s\n","MQTTCLIENT CONNECT OK");
	}
}

/***********************************
和服务器断开的回调函数
***********************************/
void opencpu_disc_cb(){
	opencpu_printf("%s\n","MQTTCLIENT DISCONNECTED ");
}

mqtt_test2()
{
	opencpu_printf("mqtt test2 start\n");
	opencpu_mqttdel();
	opencpu_mqttcfg(HOST,1883,CLIENTID,60,USER,PWD,1);
	int mqttopenstate = opencpu_mqttopen(1,1,0,0,0,0,0);
	opencpu_printf("mqtt mqtt open state %d \n",mqttopenstate);
	while(opencpu_mqttstat() != 5)   
	{
		vTaskDelay(1000/portTICK_RATE_MS);
	}
	onenetFlag = 1;

	vTaskDelay(1000/portTICK_RATE_MS);

	opencpu_mqttsub("$oc/devices/{id}/user/test",1,opencpu_userpublish_cb);
	opencpu_mqttpub("$oc/devices/{id}/user/test",0,0,0,0,"{\"id\":123458,\"dp\":{\"temperatrue\":[{\"v\":31,}],\"power\":[{\"v\":58,}]}}",NULL);
	
	vTaskDelay(1000/portTICK_RATE_MS);
	opencpu_mqttdisc();        // 关闭mqtt连接,避免无法进入PSM模式
	opencpu_mqttdel();
	vTaskDelay(1000/portTICK_RATE_MS);
	opencpu_printf("mqtt test2 over\n");
}

在编写过程中,如果mqtt没有断开是无法进入PSM模式的,使用完后请调用opencpu_mqttdisc();

猜你喜欢

转载自blog.csdn.net/qq_33259323/article/details/111832190