這篇主要教大家怎麼用Bluetooth API去
- 搜尋裝置
- 連結裝置
- 傳送指令至裝置上
首先要先宣告下列三個物件與常數,private static BluetoothAdapter mBluetoothAdapter = null; // 用來搜尋、管理藍芽裝置
private static BluetoothSocket mBluetoothSocket = null; // 用來連結藍芽裝置、以及傳送指令
private static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB"); // 一定要是這組
private static OutputStream mOutputStream = null;
private final int REQUEST_ENABLE_BT=1;
第一個物件是用來判斷android的藍芽是否有開啟,
或者可不可以用,以及利用該物件去搜尋裝置。
第二個物件是用來連結藍芽裝置的,
第三個常數是固定的,因為連線是用serial port,所以固定用這組。
第四個是等等用來傳指令的outputStream
接著下面的code,是用來做init的動作
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (mBluetoothAdapter == null) {
// 如果裝置不支援藍芽
Toast.makeText(this, "Device doesn't support bluetooth", Toast.LENGTH_SHORT).show();
return;
}
// 如果藍芽沒有開啟
if (!mBluetoothAdapter.isEnabled()) {
// 發出一個intent去開啟藍芽,
Intent mIntentOpenBT = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(mIntentOpenBT, REQUEST_ENABLE_BT);
}
上段的第二個if當中,如果你手機的藍芽未開啟,
會進到if,進到if以後就會發出一個intent request去開啟藍芽,
基本上會看到下面的畫面,會詢問你是否要開啟藍芽。
如果按下Yes,接著會在onActivityResult接收到。
這裡就不多做說明。
這裡假設手機的藍芽已經開啟。
接著下段code是去判斷這台手機裡面,
是否有已經配對過的藍芽裝置,
當然,你也可以在for迴圈中判斷是否有你要連結的裝置名稱,
有的話,就可以直接在這裡連結至裝置。
但這裡假設我們要連結的裝置還沒有配對過
// 取得目前已經配對過的裝置
Set<bluetoothdevice> setPairedDevices = mBluetoothAdapter.getBondedDevices();
// 如果已經有配對過的裝置
if (setPairedDevices.size() > 0) {
// 把裝置名稱以及MAC Address印出來
for (BluetoothDevice device : setPairedDevices) {
mArrayAdapter.add(device.getName() + "\n" + device.getAddress());
}
}
接下來我們要註冊一個BroadcastReceiver,主要是用來接收【搜尋到附近藍芽裝置】的訊息
// 註冊一個BroadcastReceiver,等等會用來接收搜尋到裝置的消息
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
registerReceiver(mReceiver, filter);
mBluetoothAdapter.startDiscovery(); //開始搜尋裝置
接著要宣告上段code使用到的BroadcastReceiver,
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
// 當收尋到裝置時
if (BluetoothDevice.ACTION_FOUND.equals(intent.getAction())) {
// 取得藍芽裝置這個物件
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// 判斷那個裝置是不是你要連結的裝置,根據藍芽裝置名稱判斷
if (device.getName().equals("MY_DEVICE_ID")){
try {
// 一進來一定要停止搜尋
mBluetoothAdapter.cancelDiscovery();
// 連結到該裝置
mBluetoothSocket = device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
mBluetoothSocket.connect();
// 取得outputstream
mOutputStream = mBluetoothSocket.getOutputStream();
// 送出訊息
String message = "hello";
mOutputStream.write(message.getBytes());
} catch (IOException e) {
}
}
}
}
};
在上段code中的連結到該裝置的code,基本上會看到下圖,
要你輸入配置碼,輸入以後,就可以連結到該裝置,
並且可以傳送訊息到你的藍芽裝置上去了。
最後,記得要在關閉程式,或者暫停時,
把連線關掉!
@Override
protected void onPause() {
super.onPause();
try {
if (mBluetoothSocket.isConnected()){
mBluetoothSocket.close();
}
unregisterReceiver(mReceiver);
} catch (IOException e) {
e.printStackTrace();
}
}
恩,下一篇會教學大家怎麼用Android透過藍芽連結到Arduino電路板上去。
用Java寄MAIL不是這篇的重點,
反正主要是用JavaMail API就是了!
code 如下,就不多做說明:
final String MAIL_HOST = "smtp.gmail.com"; // gmail的smtp
final String GMAIL_ACCOUNT = "XXXXX@gmail.com"; //gmail account
final String GMAIL_PASSWORD = "XXXXX"; // gmail pwd
final String strRecipients = "xxx@gmail.com"; // 收件人
final String strSender = "ejustmake@gmail.com"; // 寄件人名稱
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
Properties props = new Properties();
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.host", MAIL_HOST);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.socketFactory.port", "465");//smtp PORT 528好像也可以
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.quitwait", "false");
// Authenticate的動作
Session session = Session.getDefaultInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
String account = GMAIL_ACCOUNT;
String pass = GMAIL_PASSWORD;
return new PasswordAuthentication(account, pass);
}
});
MimeMessage message = new MimeMessage(session);
message.setstrSender(new InternetAddress(strSender));
message.setSubject("Mail標題", "UTF-8");
message.setContent(strBody, "text/html;charset=utf-8");//這裡用text/html就可以傳網頁的內容!
message.setstrRecipients(Message.RecipientType.TO, InternetAddress.parse(strRecipients));
Transport.send(message);
然後這段code在任何一台host上,甚至local上都可以run,
但是打包成war搬上去ec2以後就出現AuthenticationFail問題.....
恩,主要問題是被Google擋住了!
因為我用的帳號平常是在台灣進行登入!
可是搬上去ec2以後...因為主機是在美國,
所以變成IP變成從美國登入...
會被擋住,但是GOOGLE會發一封MAIL給你,
內容如下圖,反正就是詢問這是不是你,如果是你,
就點下圖中的紅色框框,點了以後按照步驟做,
然後再用你的應用程式登入一次,就成功了!
Amazon有推出一套plugin for eclipse,
可以讓使用者在eclipse開發Java Application或者J2EE,
然後deploy上去
AWS Elastic Beanstalk!
當然你也可以自己在本機寫好,
然後用FTP將project上傳到你的EC2上面去!
利用這樣的方式去執行!
但這邊提供一個利用Eclipse Deploy上去的方法!
而
AWS Elastic Beanstalk是Amazon推出的PaaS平台!
開發者一樣不用去管Infrastructure!
但是當你Deploy上去,Amazon可是會自動幫你create一個EC2的唷!
所以還是要注意費用!
不過這個EC2的AMI是選用Amazon Linux AMI,這個AMI也是有Free Usage Tier的!
但還是要注意一下別超過配額!
至於詳細的
AWS Elastic Beanstalk介紹可以去官網看!
或者等待我下一篇的介紹吧!
這篇主要介紹如何安裝Plugin至Eclipse上!
這裡建議您使用
Eclipse J2EE的版本比較方便後面的開發!
當然你也可以使用Eclipse Classic 的版本,(我自己是使用Classic)
只是就要去安裝
WTP!
WTP是一個plugin可以讓你在Eclipse Classic版本中開發Java Web(jsp, jsf..etc)!
這裡就不另作說明了!
首先先開啟你的 Eclipse,
然後點選Help-> Install New Software
如下圖!
接著點選下圖中的Add,然後輸入AWS Plugin的位置!
接著就勾選下圖中的AWS Toolkit for Eclipse,然後進行安裝!
安裝完成,會在Toolbar上看到Amazon的圖示! 點選一下!
可以看到很多選項!
像是New AWS Java Project,
或者Show AWS Explorer View等等之類的!
但我們要先選擇Preferences,
要先設定一些資訊!
首先我們要先建立一個Account,
在Account Name輸入你在AWS的帳號!
然後輸入你的Access Key Id以及Secret Access Key!
如果忘記的人可以來這
https://aws-portal.amazon.com/gp/aws/securityCredentials?看!
或者點選下圖中的"find your existing AWS security credentials."去找
設定完成以後,就可以跟你的AWS連結上了!
我們可以點選
Show AWS Explorer View來看看我們AWS上的設定!點選以後,會出現下圖! 你可以用來觀看AWS上的設定!
這裡我們點選Amazon EC2->Instances
會出現下圖! 像我AWS上面擁有兩個Instance,所以就會出現兩個!
當然你也可以在此Dilaog中去stop或者start甚至是reboot這個instance!
完成上面的步驟就代表安裝成功了!
下一篇會說明如何Deploy一個Project上去
AWS Elastic Beanstalk