This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

NB-IoT sim card configuration on NRF9160 DK

Hello,

I'm working on the mqtt_simple sample in zephyr environment for NRF9160 board.

We tested the firmware with 2 sim cards with different packets: IPv4 and IPv6, both supports NB-IoT.  However, the one with IPv6 cannot be configured to network due to Timeout Error -60, using the same source code as the IPv4. 

Do we need to change the configuration when we switch from IPv4 to IPv6?

Thank you.

Parents
  • Hi!

    So it doesn't look like the MQTT Simple sample has support for IPv6. 

    You can modify the sample L319  - L334 in main.c to something like this.

    struct sockaddr_in6 *broker6 =
    	((struct sockaddr_in6 *)&broker);
    char ipv6_addr[NET_IPV6_ADDR_LEN];
    
    broker6->sin6_addr.s6_addr =
    	((struct sockaddr_in6 *)addr->ai_addr)
    	->sin6_addr.s6_addr;
    broker6->sin6_family = AF_INET6;
    broker6->sin6_port = htons(CONFIG_MQTT_BROKER_PORT);
    
    inet_ntop(AF_INET6, &broker6->sin6_addr.s6_addr,
    	  ipv6_addr, sizeof(ipv6_addr));
    printk("IPv6 Address found %s\n", ipv6_addr);
    break;

    If you want to use the same sample for both IPv4 and IPv6, you can use a switch case as they've done in supl_support c (line 90)

    So something like this

    switch (sa->sa_family) {
    case AF_INET6:
    	struct sockaddr_in6 *broker6 =
    		((struct sockaddr_in6 *)&broker);
    	char ipv6_addr[NET_IPV6_ADDR_LEN];
    
    	broker6->sin6_addr.s6_addr =
    		((struct sockaddr_in6 *)addr->ai_addr)
    		->sin6_addr.s6_addr;
    	broker6->sin6_family = AF_INET6;
    	broker6->sin6_port = htons(CONFIG_MQTT_BROKER_PORT);
    
    	inet_ntop(AF_INET6, &broker6->sin6_addr.s6_addr,
    		  ipv6_addr, sizeof(ipv6_addr));
    	printk("IPv6 Address found %s\n", ipv6_addr);
    	break;
    case AF_INET:
    	struct sockaddr_in *broker4 =
    		((struct sockaddr_in *)&broker);
    	char ipv4_addr[NET_IPV4_ADDR_LEN];
    
    	broker4->sin_addr.s_addr =
    		((struct sockaddr_in *)addr->ai_addr)
    		->sin_addr.s_addr;
    	broker4->sin_family = AF_INET;
    	broker4->sin_port = htons(CONFIG_MQTT_BROKER_PORT);
    
    	inet_ntop(AF_INET, &broker4->sin_addr.s_addr,
    		  ipv4_addr, sizeof(ipv4_addr));
    	printk("IPv4 Address found %s\n", ipv4_addr);
    	break;
    }	

    Let me know how that goes!

    Best regards,

    Heidi

Reply
  • Hi!

    So it doesn't look like the MQTT Simple sample has support for IPv6. 

    You can modify the sample L319  - L334 in main.c to something like this.

    struct sockaddr_in6 *broker6 =
    	((struct sockaddr_in6 *)&broker);
    char ipv6_addr[NET_IPV6_ADDR_LEN];
    
    broker6->sin6_addr.s6_addr =
    	((struct sockaddr_in6 *)addr->ai_addr)
    	->sin6_addr.s6_addr;
    broker6->sin6_family = AF_INET6;
    broker6->sin6_port = htons(CONFIG_MQTT_BROKER_PORT);
    
    inet_ntop(AF_INET6, &broker6->sin6_addr.s6_addr,
    	  ipv6_addr, sizeof(ipv6_addr));
    printk("IPv6 Address found %s\n", ipv6_addr);
    break;

    If you want to use the same sample for both IPv4 and IPv6, you can use a switch case as they've done in supl_support c (line 90)

    So something like this

    switch (sa->sa_family) {
    case AF_INET6:
    	struct sockaddr_in6 *broker6 =
    		((struct sockaddr_in6 *)&broker);
    	char ipv6_addr[NET_IPV6_ADDR_LEN];
    
    	broker6->sin6_addr.s6_addr =
    		((struct sockaddr_in6 *)addr->ai_addr)
    		->sin6_addr.s6_addr;
    	broker6->sin6_family = AF_INET6;
    	broker6->sin6_port = htons(CONFIG_MQTT_BROKER_PORT);
    
    	inet_ntop(AF_INET6, &broker6->sin6_addr.s6_addr,
    		  ipv6_addr, sizeof(ipv6_addr));
    	printk("IPv6 Address found %s\n", ipv6_addr);
    	break;
    case AF_INET:
    	struct sockaddr_in *broker4 =
    		((struct sockaddr_in *)&broker);
    	char ipv4_addr[NET_IPV4_ADDR_LEN];
    
    	broker4->sin_addr.s_addr =
    		((struct sockaddr_in *)addr->ai_addr)
    		->sin_addr.s_addr;
    	broker4->sin_family = AF_INET;
    	broker4->sin_port = htons(CONFIG_MQTT_BROKER_PORT);
    
    	inet_ntop(AF_INET, &broker4->sin_addr.s_addr,
    		  ipv4_addr, sizeof(ipv4_addr));
    	printk("IPv4 Address found %s\n", ipv4_addr);
    	break;
    }	

    Let me know how that goes!

    Best regards,

    Heidi

Children
No Data
Related