iOS 给iot设备配网

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 给iot设备配网相关的知识,希望对你有一定的参考价值。

参考技术A 手机端发送组播给iot设备, iot设备根据接收到的组播信息,链接wifi,链接成功后发送广播告诉手机已连接成功
此处只展示实现组播的功能, 发送什么数据, 怎么发送, 发送多少暂时不讨论

手机端组播,需要使用UDP, 已有现成的GCDAsyncUdpSocket可用,可以节省一部分工作

关于GCDAsyncUdpSocket的使用网上有很多文档,只展示出实现组播功能的一小部分, 当然为了封装成SDK将GCDAsyncUdpSocket 转换成了LZXAsyncUdpSocket 以免项目中再次用到 GCDAsyncUdpSocket 时 冲突

单播、组播、广播差别: https://www.cnblogs.com/wzjhoutai/p/6917477.html
GCDAsyncUdpSocket 组播监听端口接收数据 https://blog.csdn.net/nogodoss/article/details/27313043

百味勺子——复位配网和电量报警实现篇

1、复位配网

百味勺子只有一个物理按键,同时复用为电源键和配网按键。电源按键直接将模组断电而非进入低功耗休眠模式。当用作配网按键时,通过快速上下电三次模组会解除与当前已绑定设备的信息,重新进入配网模式新设备可以正常连接。如果为同一台设备须在APP上解除与当前产品的绑定即可重新配网。

复位配网原理:设立一个配网标志位,在第一次断电重新上电后将标志位的值写入flash,第二次上电标志位的值加一,依此类推,同时开启一个定时器,当时间到某一个设定值(判定设备已进入正常工作状态)后清除当前flash中的标志位。第三次时会调用函数 tuya_ble_device_factory_reset()进行设备重置,同时添加一个配网指示灯显示当前联网状态。快闪表示进入配网模式等待设备连接,常亮表示设备已配网。功能实现代码如下:

// 清除flash中断电配网标志位
static int clear_ble_flag(void)
{
	Flash_Write_Buff[0] = 0;
	flash_erase_sector(FLASH_ADDR);
	flash_write_page(FLASH_ADDR, FLASH_BUFF_LEN, (unsigned char *)Flash_Write_Buff);
	blt_soft_timer_delete(&clear_ble_flag);
	return 0;
}

//通断电三次配网
uint8_t switch_setup_network(void)
{
	blt_soft_timer_add(&clear_ble_flag, 5000*TIME_MS);	// 设备正常使用5s后清除flash中断电配网标志位
	flash_read_page(FLASH_ADDR, FLASH_BUFF_LEN, (unsigned char *)Flash_Read_Buff);
	Flash_Write_Buff[0] = Flash_Read_Buff[0];
	TUYA_APP_LOG_INFO("Flash_Read_Buff[1] = %d", Flash_Read_Buff[0]);

	// 上下电三次重新配网
	if (Flash_Read_Buff[0] < POWER_COUNT) {
		Flash_Write_Buff[0]++;
		flash_erase_sector(FLASH_ADDR);
		flash_write_page(FLASH_ADDR, FLASH_BUFF_LEN, (unsigned char *)Flash_Write_Buff);
	} else {
		TUYA_APP_LOG_INFO("start connect new device");
		tuya_ble_device_factory_reset();	// 断开与当前设备的连接(会清除已绑定设备的信息),进入配网模式
	}

	return Flash_Write_Buff[0];
}
void led_connect_status(void)		//配网指示灯状态判断 loop中调用
{
	if (BONDING_CONN == status_flag) {
		gpio_write(BLE_LED_PIN, 0);
	} else {
		if (clock_time_exceed(time_tick, TIME_MS * 400)) {
			time_tick = clock_time();

			gpio_toggle(BLE_LED_PIN);
		}
	}
}

switch_setup_network()会在初始化函数中调用,led_connect_status()在loop中调用。

2、电量报警

通过ADC采集到电池电压,当电压值低于总电压的10%(电压为3.5V)时会在APP上报警提示用户对设备充电。get_battery_value()在loop中调用,每10s采集一次电池电压。

// ADC采样频率14位,参考电压1.2V
static unsigned int get_adc_value(void)
{
	adc_init();
	adc_base_init(BATTERY_ADC_PORT);
	adc_power_on_sar_adc(1);
	return adc_sample_and_get_result();
}

// 电池电压采集
unsigned short get_battery_value(void)
{
	if (!clock_time_exceed(battery_time_tick, TIME_MS*10000)) {
			return 0;
	}
	battery_time_tick = clock_time();

	unsigned int battery_adc_value = 0;

	battery_adc_value = get_adc_value() * 2;	// 电路分压,实际电池电压 = 2*battery_adc_value
	if (battery_adc_value <= BATTERY_ADC_LOWER_LIMIT) {	//电量剩余10%APP报警
		power_alarm_buf[3] = ALARM;
		tuya_ble_dp_data_report(power_alarm_buf, DP_BUF_LEN); //上报报警状态
	} else {
		power_alarm_buf[3] = NORMAL;
		tuya_ble_dp_data_report(power_alarm_buf, DP_BUF_LEN);
	}
	TUYA_APP_LOG_INFO("battery_val = %dmv", battery_adc_value);

    return battery_adc_value;
}

上一篇:
百味勺子——环境搭建篇
下一篇:
百味勺子——味觉模式实现篇

以上是关于iOS 给iot设备配网的主要内容,如果未能解决你的问题,请参考以下文章

IoT设备WiFi配网及现状

设备配网和通用配网 UI 业务包(内附代码段)

AliOS Things 3.3.0 Wi-Fi连网的那些事

ESA2GJK1DH1K微信小程序篇: 微信小程序APUConfig给WI-Fi模块配网并绑定设备,并通过MQTT控制设备(单片机AT指令版 V1.0 使用SSL连接)

ESA2GJK1DH1K微信小程序篇: 微信小程序APUConfig给WI-Fi模块配网并绑定设备,并通过MQTT控制设备(单片机AT指令版 V1.0 使用SSL连接)

3-(微信小程序篇)WiFi模块配网以后利用小程序绑定,控制设备,一次只能绑定控制一个设备