npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

react-native-ali-smartliving

v2.0.9

Published

Component implementation for smartliving WiFi SDK of Ali fy platform

Downloads

493

Readme

react-native-ali-smartliving

npm version npm downloads npm licence Platform

Component implementation for smartliving WiFi SDK of Ali fy(飞燕) platform 生活物联网平台, to control ali-smartliving-device-alios-things with direct(websocket) or indirect WiFi mode.

Suppor 蓝牙辅助配网 of 配置App配网引导方式.

Install

npm install react-native-ali-smartliving

iOS

cd ios
pod install

Copy yw_1222_china_production.jpg downloaded from https://living.aliyun.com/ to ios/, then drag it into Xcode where AppDelegate.m lives. Ref to 集成安全图片.

Drag Pods | Development Pods | react-native-ali-smartliving | Resources | xib into top of Project in Xcode and select "Added folders: Create groups".

  • In ios/YOUR_PROJECT/AppDelegate.m
#import <react-native-ali-smartliving/AliLiving.h>
...
[AliLiving InitializeSmartliving:application launchOptions:launchOptions];

You can customize and localize the login View, ref to the commit "feat(react-native-ali-smartliving): in iOS login View, add a new button to showEmailFindPasswordView, and hide the button which showFindPasswordView with Phone"

Add WiFi support for ios 13 and above.

Add NSBluetoothAlwaysUsageDescription and NSBluetoothPeripheralUsageDescription keys to your Info.plist.

Android

Copy yw_1222_china_production.jpg downloaded from https://living.aliyun.com/ to android/app/src/main/res/drawable/ . Ref to 集成安全图片, and if runtime ErrorCode = 212 at com.alibaba.wireless.security.open.SecException after upgrade com.aliyun.iot.aep.sdk:apiclient in android/dependency.gradle, you need upload apk and download jpg again.

  • In android/app/build.gradle
/**
 * Whether to use Aliyun encryption pic such as yw_1222_china_production.jpg.
 */
def useAliyunEncryptionPic = true

android {
    defaultConfig {
        minSdkVersion 18
        targetSdkVersion 26
        multiDexEnabled true
        ndk {
            abiFilters "armeabi-v7a", "arm64-v8a" // Aliyun livinglink SDK only support these two ABIs
        }
    }
    signingConfigs {
        debug {
            if (useAliyunEncryptionPic) {
                v2SigningEnabled false
                storeFile file(RELEASE_STORE_FILE)
                storePassword RELEASE_STORE_PASSWORD
                keyAlias RELEASE_KEY_ALIAS
                keyPassword RELEASE_KEY_PASSWORD
            } else {
                storeFile file('debug.keystore')
                storePassword 'android'
                keyAlias 'androiddebugkey'
                keyPassword 'android'
            }
        }
        release {
            storeFile file(RELEASE_STORE_FILE)
            storePassword RELEASE_STORE_PASSWORD
            keyAlias RELEASE_KEY_ALIAS
            keyPassword RELEASE_KEY_PASSWORD
        }
    }
}
  • In node_modules/react-native-ali-smartliving/android/dependency.gradle

If node_modules/react-native-svg not exist in your project, you should use

api 'com.aliyun.iot.aep.page:rn:0.3.6.1'
  • In node_modules/react-native-ali-smartliving/android/build.gradle

If RN >= 0.65 that remove sourceCompatibility JavaVersion.VERSION_1_8 ref to https://react-native-community.github.io/upgrade-helper/?from=0.64.3&to=0.65.0, you should also remove

    compileOptions {
        sourceCompatibility rootProject.ext.javaSourceCompatibility
        targetCompatibility rootProject.ext.javaTargetCompatibility
    }
  • In MainApplication.java
// import com.aliyun.iot.aep.sdk.framework.AApplication;

@Override
    protected List<ReactPackage> getPackages() {
      return Arrays.<ReactPackage>asList(
          new MainReactPackage(),
            new AliLivingReactPackage(getApplication()),
      );
    }
find android/app/src/main/java/ -name MainApplication.java | xargs sed -i -e "s/extends Application/extends com.aliyun.iot.aep.sdk.framework.AApplication/"
  • In application of AndroidManifest.xml
tools:replace="android:allowBackup"
android:usesCleartextTraffic="true"

android:usesCleartextTraffic="true" here is for WebSocket working in release version, ref to https://github.com/facebook/react-native/issues/24361

Usage

import React from 'react';
import { View } from 'react-native';
import meshModule from 'react-native-ali-smartliving';

export default class MeshModuleExample extends React.Component {
    constructor(props) {
        super(props);
        meshModule.passthroughMode = {
            silan: [
                'a17hN4W4777',  // PRODUCT_KEY
                'directWifi',   // the fake PRODUCT_KEY needed by direct WiFi mode device
            ],
            sllc: [
                'directWifi',
            ],
        };
    }

    componentDidMount() {
        meshModule.addListener('leScan', this.onLeScan);
        meshModule.doInit();
        meshModule.startScan({
            meshName: 'sysin_mesh', // if 'sysin_mesh', will scan unclaimed devices, otherwise not
            timeoutSeconds: 10,
        });
    }

    // after meshModule.startScan() found some device, will cause onLeScan() here
    onLeScan = data => console.warn(data)

    render() {
        return (
            <View/>
        );
    }
}

APP method with different Device WiFi mode

The device can be in official indirect WiFi mode or 设备端添加 WebSocket Server 支持 as unofficial direct WiFi mode.

method with direct or indirect WiFi mode

targetAddress

Get the real address of the data.params comes from various opcode in AliLiving.java.

isOnline

Get the online status of the data.params comes from various opcode in AliLiving.java.

isOn

Get the power status of the data.params comes from various opcode in AliLiving.java.

changePower

changeScene

setAlarm

Note whether you defined TimezoneOffset described as code comment in index.native.js.

Note whether you use alarmId 0 or alarmId 1 as 1st LocalTimer described as code comment in index.native.js.

method with direct WiFi mode

No need login, even no need burn info like productKey from https://living.aliyun.com into device, no need change mac address of device, you can still controll the device, only need your smartphone connect WiFi to the AP comes from the device.

socket device simulated on computer and controlled by APP

If you want just debug with a device simulated on computer, you need

node node_modules/react-native-ali-smartliving/simSocketDevice/server.js

and comment the line state.details.ipAddress.match in index.native.js

and edit let host = this.directWifiIpv4Byte3 + '1' to e.g. let host = '192.168.1.100' where 192.168.1.100 is the IP address of you computer which connected the same LAN that your smartphone connected.

websocket device simulated on computer and controlled by Web

If you want just debug with a device simulated on computer, you need

git clone https://github.com/warmcat/libwebsockets -b v2.4.1

add lwsl_notice(" %s\n", (const char *)in); in case LWS_CALLBACK_RECEIVE: of libwebsockets/test-apps/test-server-dumb-increment.c, then

cd libwebsockets
mkdir build
cd build
cmake ..
make
./bin/libwebsockets-test-server --port=8821

and edit let host = this.directWifiIpv4Byte3 + '1' to e.g. let host = '127.0.0.1' and edit local-ali-smartliving to dumb-increment-protocol in index.web.js.

method with indirect WiFi mode

login

Actually there is no login function supported by Ali ilop sdk, when it's not login state, the login and register dialog will appears automatically.

Default only email register, if you also want mobile register, on Android, modify android/src/main/java/ugen/fy/plugin/OALoginActivity.java supportMobile to true, on iOS, customize and localize the login View described above, and you need buy sms support on https://living.aliyun.com/.

logout

startScan

example:

meshModule.addListener('leScan', console.warn);
meshModule.startScan({
        meshName: 'sysin_mesh', // if 'sysin_mesh', will scan unclaimed devices, otherwise not
        timeoutSeconds: 10,
});

configNode

when adding device, the param is:

{
    node {
        macAddress: 'A0:FB:42:00:A1:DB',    // mac of the device found from onLeScan after startScan
        type: {
            p: 'a17hN4W4777',               // PRODUCT_KEY
            d: 5, // 5 comes from onLeScan means DiscoveryType.COMBO_SUBTYPE_0X03_DEVICE, other discovery type not debug yet
        },
    },
    cfg: {
        newName: 'ssid of your WiFi',
        newPwd: 'password of your WiFi',
    },
    isToClaim: true,
}

when removing device, the param is:

{
    node {
        meshAddress: 'vvssa4DEzVglIGxDl777000000', // iotId
    },
    isToClaim: false,
}

loadNodes

load devices info from https://living.aliyun.com and convert them into our nodes format, then init them in native code and return nodes.

the param is:

{
    oldNodes = [{
        a: 'vvssa4DEzVglIGxDl777000000',    // iotId
        m: 'A0:FB:42:00:A1:DB',             // mac
//         i: {
//             v: 'app-1.6.0-20201201.1027'    // fwVersion
//         },
//         n: 'testDeviceName7',
//         t: {
//             d: 0, // 0 comes from loadNodes({forceRefresh: true}) means DiscoveryType.LOCAL_ONLINE_DEVICE
//             p: 'a17hN4W4777',               // PRODUCT_KEY
//         }
    }],
    forceRefresh = false,
}

getCurrentAccountMessage

send

example:

await meshModule.send(
    '/uc/listBindingByAccount',                 // path
    JSON.stringify({pageNo: 1, pageSize: 100}), // params
    '1.0.8',                                    // version
    true,                                       // iotAuth
)

getCurrentSsid

setAlarm

getAlarm

getFirmwareVersion

getOtaUpgradeableList

startOta

startAliSocketListener (Not test yet, waiting your result)

When getAliSocketListenerState() return not CONNECTED, you need startAliSocketListener() before subscribe().

example:

await meshModule.startAliSocketListener();

stopAliSocketListener (Not test yet, waiting your result)

example:

await meshModule.stopAliSocketListener();

getAliSocketListenerState

Will return CONNECTED with login, otherwise, please use startAliSocketListener().

subscribe (Work on Android, but not iOS for no CONNECTED, don't known why, PR is welcome)

Need getAliSocketListenerState() return CONNECTED.

example:

meshModule.addListener('subscribeState', console.warn); // subscribe successful or not
meshModule.addListener('subscribeDownstream', console.warn); // data comes from topic
await meshModule.subscribe(topic);

unsubscribe

Need getAliSocketListenerState() return CONNECTED.

ayncSendPublishRequest (Not test yet, waiting your result)

AKA publish.

Need getAliSocketListenerState() return CONNECTED.

asyncSendRequest (Not implement yet, waiting your PR)

AKA invokeWithTopic.

Need getAliSocketListenerState() return CONNECTED.

Ref to 长连接通道SDK

References