From f77479fb01435533926fd8e0097bca3b901cd01b Mon Sep 17 00:00:00 2001 From: ganben Date: Wed, 23 Nov 2016 20:04:16 +0800 Subject: [PATCH 1/5] :construction: :sparkles: new le advertiser, yunba defect still --- .gitignore | 3 +- app/build.gradle | 3 +- .../net/chaoc/blescanner/MainActivity.java | 140 +++++++++++++++++- app/src/main/res/layout/activity_main.xml | 96 +++++++++--- build.gradle | 2 +- 5 files changed, 219 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 650f395..43f53aa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # Built application files *.apk *.ap_ +*.jar # Files for the ART/Dalvik VM *.dex @@ -12,7 +13,7 @@ bin/ gen/ out/ - +libs/ # Gradle files .gradle/ build/ diff --git a/app/build.gradle b/app/build.gradle index 44a1642..0ab3773 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,10 +20,11 @@ android { } dependencies { - compile fileTree(dir: 'libs', include: ['*.jar']) + compile fileTree(include: ['*.jar'], dir: 'libs') androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:23.4.0' testCompile 'junit:junit:4.12' + compile files('libs/yunba-sdk-release1.8.0.jar') } diff --git a/app/src/main/java/net/chaoc/blescanner/MainActivity.java b/app/src/main/java/net/chaoc/blescanner/MainActivity.java index 9fa4bf2..2e0f23c 100644 --- a/app/src/main/java/net/chaoc/blescanner/MainActivity.java +++ b/app/src/main/java/net/chaoc/blescanner/MainActivity.java @@ -3,12 +3,18 @@ import android.Manifest; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothManager; +import android.bluetooth.le.AdvertiseCallback; +import android.bluetooth.le.AdvertiseData; +import android.bluetooth.le.AdvertiseSettings; +import android.bluetooth.le.BluetoothLeAdvertiser; import android.bluetooth.le.BluetoothLeScanner; import android.bluetooth.le.ScanCallback; import android.bluetooth.le.ScanResult; +import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import android.content.IntentFilter; import android.content.pm.PackageManager; import android.os.AsyncTask; import android.support.v4.app.FragmentActivity; @@ -16,11 +22,17 @@ import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; +import android.text.Editable; +import android.text.TextWatcher; import android.text.method.ScrollingMovementMethod; import android.util.Log; import android.view.View; import android.widget.Button; +import android.widget.CompoundButton; +import android.widget.EditText; import android.widget.TextView; +import android.widget.Toast; +import android.widget.ToggleButton; import org.eclipse.paho.client.mqttv3.IMqttActionListener; import org.eclipse.paho.client.mqttv3.IMqttToken; @@ -41,7 +53,13 @@ public class MainActivity extends AppCompatActivity implements android.view.View TextView peripheralTextView; private final static int REQUEST_ENABLE_BT = 1; private static final int PERMISSION_REQUEST_COARSE_LOCATION = 1; - + public String advDataStr; + AdvertiseData advData; + BluetoothLeAdvertiser advertiser; + AdvertiseSettings advSettings; + private MessageReceiver mMessageReceiver; + public final static String MESSAGE_RECEIVED_ACTION = "io.yunba.example.msg_received_action"; + AdvertiseCallback advCallback; @Override protected void onCreate(Bundle savedInstanceState) { @@ -86,16 +104,96 @@ public void onFailure(IMqttToken arg0, Throwable arg1) { } + public void registerMessageReceiver(){ + + mMessageReceiver = new MessageReceiver(); + IntentFilter filter = new IntentFilter(); + filter.addAction(YunBaManager.MESSAGE_RECEIVED_ACTION); + filter.addCategory(getPackageName()); + registerReceiver(mMessageReceiver, filter); + + IntentFilter filterCon = new IntentFilter(); + filterCon.addAction(YunBaManager.MESSAGE_CONNECTED_ACTION); + filterCon.addCategory(getPackageName()); + registerReceiver(mMessageReceiver, filterCon); + + IntentFilter filterDis = new IntentFilter(); + filterDis.addAction(YunBaManager.MESSAGE_DISCONNECTED_ACTION); + filterDis.addCategory(getPackageName()); + registerReceiver(mMessageReceiver, filterDis); + + IntentFilter pres = new IntentFilter(); + pres.addAction(YunBaManager.PRESENCE_RECEIVED_ACTION); + pres.addCategory(getPackageName()); + registerReceiver(mMessageReceiver, pres); + + } + @Override + public void onClick(View v) { +// Toast.makeText(getApplicationContext()) + } + public void init(){ btManager = (BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE); btAdapter = btManager.getAdapter(); btScanner = btAdapter.getBluetoothLeScanner(); + advertiser = btAdapter.getBluetoothLeAdvertiser(); if (btAdapter != null && !btAdapter.isEnabled()) { Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(enableIntent,REQUEST_ENABLE_BT); } +// ble advertisers + advSettings = new AdvertiseSettings.Builder() + .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED) + .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM) + .setConnectable( false ) + .build(); + advDataStr = "121383000000"; + ToggleButton toggle = (ToggleButton) findViewById(R.id.toggleButton2); + final EditText eText = (EditText) findViewById(R.id.editText4); + eText.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + + + } + + @Override + public void afterTextChanged(Editable s) { + String text; + text = s.toString(); + if (text.matches("-?[0-9a-fA-F]+") == true) { + advDataStr = s.toString(); + } else { + s.clear(); + s.append("121383000000"); + } + } + }); + + toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + //enabled + //update text value; + //validated it; if false then disabled this + //start advertising; + advertise(toByteArray(advDataStr)); + + } else { + //disabled + //stop advertising; + stopAdvertise(); + } + } + }); // Make sure we have access coarse location enabled, if not, prompt the user to enable it // if (this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { @@ -168,5 +266,45 @@ public String toHexString(byte[] bytes){ return hexString.toString(); } + public static byte[] toByteArray(String s){ + int len = s.length(); + byte[] data = new byte[len / 2]; + for (int i = 0; i < len; i += 2) { + data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + + Character.digit(s.charAt(i+1), 16)); + } + return data; + } + + + public void advertise(byte[] manuData){ + advData = new AdvertiseData.Builder() + .setIncludeDeviceName(true) + .addManufacturerData(65280, manuData) + .build(); + advCallback = new AdvertiseCallback() { + @Override + public void onStartSuccess(AdvertiseSettings settingsInEffect) { + super.onStartSuccess(settingsInEffect); + Toast.makeText(getApplicationContext(), "start advertising", Toast.LENGTH_LONG).show(); + } + }; + advertiser.startAdvertising(advSettings, advData, advCallback); + } + + public void stopAdvertise(){ + advertiser.stopAdvertising(advCallback); + + } + + public class MessageReceiver extends BroadcastReceiver { + @Override + public void onReceive(Context context, Intent intent) { + Log.i(TAG, "Action - " + intent.getAction()); + Toast.makeText(getApplicationContext(), "msg received", Toast.LENGTH_SHORT).show(); + } + } } + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 43860d1..5d39131 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,6 +1,7 @@ - -